#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;

//class Base 
//{
//public:
//	Base(int j) 
//		: i(j) 
//	{}
//	virtual~Base() 
//	{}
//	void func1() 
//	{
//		i *= 10;
//		func2();
//	}
//	int getValue() 
//	{
//		return i;
//	}
//protected:
//	virtual void func2() 
//	{
//		i++;
//	}
//protected:
//	int i;
//};
//class Child : public Base 
//{
//public:
//	Child(int j) 
//		: Base(j) 
//	{}
//	void func1() 
//	{
//		i *= 100;
//		func2();
//	}
//protected:
//	void func2() 
//	{
//		i += 2;
//	}
//};
//int main() {
//	Base* pb = new Child(1);
//	pb->func1();
//	cout << pb->getValue() << endl; 
//	delete pb;
//}

//class Test 
//{
//public:
//	int a;
//	int b;
//	virtual void fun() {}
//	Test(int temp1 = 0, int temp2 = 0)
//	{
//		a = temp1;
//		b = temp2;
//	}
//	int getA()
//	{
//		return a;
//	}
//	int getB()
//	{
//		return b;
//	}
//};
//int main()
//{
//	Test obj(5, 10);
//	// Changing a and b
//	int* pInt = (int*)&obj;
//	*(pInt + 0) = 100;
//	*(pInt + 1) = 200;
//	cout << "a = " << obj.getA() << endl;
//	cout << "b = " << obj.getB() << endl;
//	return 0;
//}

//class Base
//{
//public:
//	virtual int foo(int x)
//	{
//		return x * 10;
//	}
//	int foo(char x[14])
//	{
//		cout << sizeof(x) << endl;
//		return sizeof(x) + 10;
//	}
//};
//class Derived : public Base
//{
//	int foo(int x)
//	{
//		return x * 20;
//	}
//	virtual int foo(char x[10])
//	{
//		return sizeof(x) + 20;
//	}
//};
//int main()
//{
//	Derived stDerived;
//	Base* pstBase = &stDerived;
//	char x[10];
//	cout << sizeof(x) << endl;
//	printf("%d\n", pstBase->foo(100) + pstBase->foo(x));
//	return 0;
//}

//class A 
//{
//public:
//	~A() 
//	{
//		cout << "~A()";
//	}
//	int a = 0;
//};
//class B
//{
//public:
//	 ~B() 
//	{
//		cout << "~B()";
//	}
//	int b = 1;
//};
//class C : public A, public B 
//{
//public:
//	~C() 
//	{
//		cout << "~C()";
//	}
//	int c = 2;
//};
//int main() {
//	C* c = new C;
//	A& a = *c;
//	A a1;
//	//C& c1 = a;
//	/*B* b1 = dynamic_cast<B*>(c);
//	A* a2 = dynamic_cast<A*>(b1);
//	delete a2;*/
//}
//class Base { public:int _b = 1; };
//class Base1 :public Base { public: int _b1 = 2; };
//class Base2 :public Base { public: int _b2 = 3; };
//class Derive : public Base1, public Base2
//{
//public: 
//	int _d = 4;
//};
//
//int main() 
//{
//	Derive d;
//	/*Base1* p1 = &d;
//	Base2* p2 = &d;
//	Derive* p3 = &d;
//	cout << p1 << " " << p2 << " " << p3 << endl;*/
//	cout << sizeof(d) << endl;
//	cout << d.Base1::_b << endl;
//	return 0;
//}

//class A
//{
//public:
//   virtual void f()
//    {
//        cout << "A::f()" << endl;
//    }
//};
//
//class B : public A
//{
//private:
//   virtual void f()
//    {
//        cout << "B::f()" << endl;
//    }
//};
//
//int main()
//{
//    A* pa = (A*)new B;
//    pa->f();
//    delete pa;
//}

//class A
//{
//public:
//    A() :m_iVal(0) { /*test();*/ }
//    virtual void func() { cout << m_iVal << " "; }
//    //void test() { func(); }
//public:
//   int m_iVal;
//};
//
//class B : public A
//{
//public:
//    B() { /*test();*/}
//    virtual void func()
//    {
//        ++m_iVal;
//        cout << m_iVal << " ";
//    }
//};
//
//int main(int argc, char* argv[])
//{
//    A a; 
//    B b;
//    //A* p = new B;
//    //p->test();
//    return 0;
//}

//int main()
//{
//    string s;
//    cin >> s;
//
//    int left = 0, right = s.size() - 1;
//    while (left < right)
//    {
//        swap(s[left], s[right]);
//        left++;
//        right--;
//    }
//    cout << s << endl;
//    return 0;
//}
class Solution {
public:
    struct Great
    {
        bool operator()(const pair<string, int> p1, const pair<string, int> p2)
        {
            return p1.second > p2.second || (p1.second == p2.second && p1.first < p2.first);
        }
    };
    /*vector<string> topKFrequent(vector<string>& words, int k)
    {
        map<string, int> countMap;
        for (auto e : words)
        {
            countMap[e]++;
        }
        vector<pair<string, int>> v(countMap.begin(), countMap.end());
        sort(v.begin(), v.end(), Great());

        int i = 0;
        vector<string> ret;
        for (i = 0; i < k; i++)
        {
            ret.push_back(v[i].first);
        }
        return ret;
    }*/
    vector<string> topKFrequent(vector<string>& words, int k)
    {
        map<string, int> countMap;
        for (auto e : words)
        {
            countMap[e]++;
        }
        priority_queue<pair<string, int>, vector<pair<string, int>>, Great> q;
        for (auto& e : countMap)
        {
            q.push(e);
            if (q.size() > k)
            {
                q.pop();
            }
        }
        vector<string> ret;
        while (!q.empty())
        {
            ret.push_back(q.top().first);
            q.pop();
        }
        return ret;
    }
};
int main()
{
    string s1, s2;
    cin >> s1;
    cin >> s2;
    int len1 = s1.size();
    int len2 = s2.size();

    int max = 0;
    for (int i = 0; i < len1; i++)
    {
        for (int j = 0; j < len2; j++)
        {
            if (s1[i] == s2[j])
            {
                int m = i, n = j;
                int count = 0;
                while (m < len1 && n < len2 && s1[m] == s2[n])
                {
                    count++;
                    m++, n++;
                }
                if (count > max)
                {
                    max = count;
                }
            }
        }
    }
    cout << max << endl;
    return 0;
}